home *** CD-ROM | disk | FTP | other *** search
/ C++ für Kids / C++ for kids.iso / Buch / hangy.cpp < prev    next >
C/C++ Source or Header  |  1999-02-01  |  8KB  |  265 lines

  1. //---------------------------------------------------------------------------
  2. #include <vcl\vcl.h>
  3. #pragma hdrstop
  4.  
  5. #include "hangy.h"
  6. //---------------------------------------------------------------------------
  7. #pragma resource "*.dfm"
  8.  
  9. const String Pfad = "c:\\cpp\\buch\\";
  10.  
  11. class THangMan : public TObject
  12. {
  13. private:
  14.   int OK;
  15.   int Nr;
  16.   int Laenge;
  17.   int Max;
  18.   bool Fertig;
  19.   bool Mimik;
  20.   String RateText;
  21.   String Geraten;
  22.   TStringList *Liste;
  23.   void __fastcall SetZero(void);
  24. public:
  25.   virtual void __fastcall ClearHangMan(void);
  26.   virtual void __fastcall DrawHangMan(void);
  27.   virtual void __fastcall ShowHangMan(void);
  28.   virtual void __fastcall GetKey (char Key);
  29.   virtual void __fastcall GetList (String Datei);
  30.   __fastcall THangMan(String Datei);
  31.   virtual __fastcall ~THangMan(void);
  32. };
  33.  
  34. THangMan *HangMan;
  35. TForm1 *Form1;
  36.  
  37. //---------------------------------------------------------------------------
  38. __fastcall THangMan::THangMan (String Datei)
  39. {
  40.   Liste = new TStringList;
  41.   SetZero ();
  42.   Mimik = true;
  43.   try
  44.   {
  45.     Liste->LoadFromFile (Datei);
  46.     Max = Liste->Count;
  47.   }
  48.   catch (...)
  49.   {
  50.     Form1->Panel1->Caption = "Ohne Worte!";
  51.     Max = 0;
  52.   }
  53. }
  54. //---------------------------------------------------------------------------
  55. __fastcall THangMan::~THangMan(void)
  56. {
  57.   Liste->Clear ();
  58.   delete Liste;
  59. }
  60. //---------------------------------------------------------------------------
  61. void __fastcall THangMan::SetZero (void)
  62. {
  63.   Geraten = "";
  64.   Nr = 0;
  65.   OK = 0;
  66.   Fertig = false;
  67.   Form1->Image1->Canvas->Brush->Color = clGray;
  68.   Form1->Image1->Canvas->Rectangle(0,0,140,200);
  69. }
  70. //---------------------------------------------------------------------------
  71. void __fastcall THangMan::ClearHangMan (void)
  72. {
  73.   SetZero ();
  74.   if (Max > 0) RateText = UpperCase(Liste->Strings[random(Max)]);
  75.   else RateText = UpperCase("Zehplusplus");
  76.   Laenge = RateText.Length();
  77.   for (int i=0; i<Laenge; i++)
  78.   {
  79.     Geraten = Geraten + "?";
  80.   }
  81.   Form1->Panel1->Caption = Geraten;
  82.   Form1->Label1->Caption = "Buchstaben eintippen!";
  83. }
  84. //---------------------------------------------------------------------------
  85. void __fastcall THangMan::ShowHangMan (void)
  86. {
  87.   int Mix = 10;
  88.   if (Mimik) Mix = 11;
  89.   Nr = 0;
  90.   while (Nr < Mix) {Nr++; DrawHangMan ();}
  91.   Form1->Panel1->Caption = RateText;
  92.   if (RateText.IsEmpty())
  93.     Form1->Label1->Caption = "Da ist kein Wort";
  94.   else
  95.     Form1->Label1->Caption = "ist das Wort";
  96.   Mimik = !Mimik;
  97. }
  98. //---------------------------------------------------------------------------
  99. void __fastcall THangMan::DrawHangMan (void)
  100. {
  101.   Form1->Image1->Canvas->Pen->Width = 3;
  102.   Form1->Image1->Canvas->Brush->Color = clSilver;
  103.   switch (Nr)
  104.   {
  105.     case 1:
  106.       Form1->Image1->Canvas->MoveTo (30,10);
  107.       Form1->Image1->Canvas->LineTo (30,200);
  108.       break;
  109.     case 2:
  110.       Form1->Image1->Canvas->MoveTo (30,10);
  111.       Form1->Image1->Canvas->LineTo (95,10);
  112.       break;
  113.     case 3:
  114.       Form1->Image1->Canvas->MoveTo (95,10);
  115.       Form1->Image1->Canvas->LineTo (95,30);
  116.       break;
  117.     case 4:
  118.       Form1->Image1->Canvas->Brush->Color = clRed;
  119.       Form1->Image1->Canvas->Ellipse (80,30,110,65);
  120.       break;
  121.     case 5:
  122.       Form1->Image1->Canvas->Ellipse (80,65,110,130);
  123.       break;
  124.     case 6:
  125.       Form1->Image1->Canvas->MoveTo (90,130);
  126.       Form1->Image1->Canvas->LineTo (90,170);
  127.       break;
  128.     case 7:
  129.       Form1->Image1->Canvas->MoveTo (100,130);
  130.       Form1->Image1->Canvas->LineTo (100,170);
  131.       break;
  132.     case 8:
  133.       Form1->Image1->Canvas->Ellipse (75,165,95,175);
  134.       break;
  135.     case 9:
  136.       Form1->Image1->Canvas->Ellipse (95,165,115,175);
  137.       break;
  138.     case 10:
  139.       Form1->Image1->Canvas->Brush->Color = clAqua;
  140.       Form1->Image1->Canvas->Ellipse (80,30,110,65);
  141.       Form1->Image1->Canvas->Brush->Color = clYellow;
  142.       Form1->Image1->Canvas->Ellipse (86,38,95,48);
  143.       Form1->Image1->Canvas->Ellipse (95,38,104,48);
  144.       Form1->Image1->Canvas->Arc (86,54,104,60,104,57,86,57);
  145.       break;
  146.     case 11:
  147.       Form1->Image1->Canvas->Brush->Color = clFuchsia;
  148.       Form1->Image1->Canvas->Ellipse (80,30,110,65);
  149.       Form1->Image1->Canvas->Brush->Color = clLime;
  150.       Form1->Image1->Canvas->Ellipse (86,38,95,48);
  151.       Form1->Image1->Canvas->Ellipse (95,38,104,48);
  152.       Form1->Image1->Canvas->Arc (86,45,104,60,86,53,104,53);
  153.   }
  154. }
  155. //---------------------------------------------------------------------------
  156. void __fastcall THangMan::GetKey (char Key)
  157. {
  158.   String Taste = UpperCase(Key);
  159.   bool Enthalten = false;
  160.  
  161.   if (!Fertig)
  162.   {
  163.     // Jeden Buchstaben einzeln ⁿberprⁿfen
  164.     for (int i=1; i<=Laenge; i++)
  165.     {
  166.       if (Taste == RateText.SubString(i,1))
  167.       {
  168.         if (Taste != Geraten.SubString(i,1))
  169.         {
  170.           OK++;
  171.           Geraten[i] = Key;
  172.           Geraten = UpperCase(Geraten);
  173.         }
  174.         Enthalten = true;
  175.       }
  176.     }
  177.     // Wenn Key enthalten, anzeigen
  178.     if (Enthalten)
  179.       Form1->Panel1->Caption = Geraten;
  180.     // sonst Hangman weiterzeichnen
  181.     else
  182.     {
  183.       Nr++;
  184.       if (Nr < 11) DrawHangMan ();
  185.     }
  186.     // Wenn alle Buchstaben geraten, OK
  187.     if ((OK >= Laenge) && (Nr < 10))
  188.     {
  189.       if (RateText.IsEmpty())
  190.         Form1->Label1->Caption = "Klick auf NEU!";
  191.       else
  192.         Form1->Label1->Caption = "OK";
  193.       SetZero ();
  194.       Fertig = true;
  195.       Form1->Image1->Picture->LoadFromFile ("HangMan.bmp");
  196.     }
  197.     // Wenn Hangman vollstΣndig, TOT
  198.     else if ((Nr >= 10) && (!Fertig))
  199.     {
  200.       Form1->Panel1->Caption = RateText;
  201.       Form1->Label1->Caption = "TOT";
  202.     }
  203.   }
  204. }
  205. //---------------------------------------------------------------------------
  206. void __fastcall THangMan::GetList (String Datei)
  207. {
  208.   SetZero ();
  209.   try
  210.   {
  211.     Liste->LoadFromFile (Datei);
  212.     Max = Liste->Count;
  213.   }
  214.   catch (...)
  215.   {
  216.     Form1->Panel1->Caption = "Ohne Worte!";
  217.     Max = 0;
  218.   }
  219. }
  220. //---------------------------------------------------------------------------
  221. __fastcall TForm1::TForm1(TComponent* Owner)
  222.     : TForm(Owner)
  223. {
  224. }
  225. //---------------------------------------------------------------------------
  226. void __fastcall TForm1::FormCreate(TObject *Sender)
  227. {
  228.   randomize ();
  229.   HangMan = new THangMan (Pfad+"HangMan.txt");
  230. }
  231. //---------------------------------------------------------------------------
  232. void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
  233. {
  234.   delete HangMan;
  235. }
  236. //---------------------------------------------------------------------------
  237. void __fastcall TForm1::NewButtonClick(TObject *Sender)
  238. {
  239.   HangMan->ClearHangMan ();
  240. }
  241. //---------------------------------------------------------------------------
  242. void __fastcall TForm1::ReadyButtonClick(TObject *Sender)
  243. {
  244.   Form1->Image1->Canvas->Brush->Color = clGray;
  245.   Form1->Image1->Canvas->Rectangle(0,0,140,200);
  246.   HangMan->ShowHangMan ();
  247. }
  248. //---------------------------------------------------------------------------
  249. void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
  250. {
  251.   HangMan->GetKey (Key);
  252. }
  253. //---------------------------------------------------------------------------
  254. void __fastcall TForm1::Oeffnen1Click(TObject *Sender)
  255. {
  256.   if (OpenDialog1->Execute())
  257.     HangMan->GetList (OpenDialog1->FileName);
  258. }
  259. //---------------------------------------------------------------------------
  260. void __fastcall TForm1::Ende1Click(TObject *Sender)
  261. {
  262.   Close ();
  263. }
  264. //---------------------------------------------------------------------------
  265.